import numpy as np

# 切片
X = np.arange(16)
np.random.shuffle(X)
print("X1:", X)
print(X[3])
print(X[3:9])
print(X[3:9:2])

# FancyIndeXing
# 索引数组
index = [3, 5, 8]
print("fincyIndex1:", X[index])
# 索引矩阵
index = np.array([[0, 2],
                  [1, 3]])
print("fincyIndex2:", X[index])

# 矩阵的索引
X = X.reshape(4, -1)
print("X2:", X)
row = np.array([0, 1, 2])   # 行索引
col = np.array([1, 2, 3])   # 列索引
print(X[row, col])          # 行列索引组合，组成3个数
print(X[0, col])            # 在第0行取列索引
print(X[:2, col])           # 在前两行取列索引

# 布尔索引
col = [True, False, True, True] # 等价于[0,2,3]
print(X[1:3, col])

# 条件运算：比较
print("X3:", X)
print(X>3)                      # X的每个元素做布尔运算，得到布尔矩阵
result = 2 * X == 24 - 4 * X    # 求方程
print(result)                   # 得到满足方程的布尔矩阵
print(X[result])                # 通过布尔索引，输出结果为True的元素
print(np.sum(X<3))              # 求满足条件的个数，True=1, False=0
print(np.count_nonzero(X<3))    # 与上面一行代码等价

# 条件运算：any()与all()
print(np.any(X == 0))           # 矩阵中只要有元素就返回True
print(np.all(X > 0))            # 矩阵中元素全大于0就返回True
print(np.all(X > 0, axis=0))    # 矩阵中每列的元素全大于0就返回True

print(np.sum(X % 2 == 0))       # 统计有多少个偶数
print(np.sum(X % 2 == 0, axis=0))

# 位运算
print(np.sum((X > 3) & (X < 7)))    # 与运算,统计矩阵中大于3并且小于7的元素的个数
print((X % 2 == 0) | (X > 10))      # 或运算
print(np.sum(~(X == 0)))            # 非运算

# 通过布尔索引取得满足条件运算结果的元素
print("X4:", X)
print(X[X>5])                   # 得到矩阵中大于5的元素
print(X[X % 2 == 0])
print(X[:, 3] % 3 == 0)
print(X[X[:, 3] % 3 == 0, :])   # 在矩阵中抽出一些行，满足这些行的第4列元素必须能被3整除

